package net.servir.capacidades.web.controller;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import net.servir.capacidades.model.Profesion;
import net.servir.capacidades.model.Regimen;
import net.servir.capacidades.model.Responsable;
import net.servir.capacidades.model.ResponsableBusqueda;
import net.servir.capacidades.model.Sistema;
import net.servir.capacidades.model.Usuario;
import net.servir.capacidades.model.jsp.JspResponsableEdicion;
import net.servir.capacidades.service.CapacidadesService;
import net.servir.capacidades.service.CensoService;
//import net.servir.capacidades.model.Persona;
//import net.servir.capacidades.service.ws.impl.SRELServiceWSImpl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ResponsableBusquedaController {

	@Autowired 
	private CapacidadesService capacidadesService;
	@Autowired 
	private CensoService censoService;

	//private SRELServiceWSImpl sRELServiceWS;
	@RequestMapping("/responsableBusqueda.htm")
	public @ModelAttribute("responsableBusqueda")
	ResponsableBusqueda censo(HttpServletRequest request) throws Exception {

		ResponsableBusqueda obj = new ResponsableBusqueda();		
		//sRELServiceWS = new SRELServiceWSImpl();
		//************************************************************
		// se obtiene el dni de la session activa
		//************************************************************
		HttpSession session = request.getSession();
		String cod_session =session.getId();
		
		String dniUsuario = null;
		if(session.getAttribute("dni") != null)			
			dniUsuario = session.getAttribute("dni").toString();
		
		//Obtenemos los datos del responsable
		Usuario usuario = null;
		if(session.getAttribute("usuario") != null)			
			usuario = (Usuario)session.getAttribute("usuario");
		
		if (usuario == null)
			throw new Exception("No se ha identificado al usuario");
		
		obj.setUsuario(usuario);				
			
		//************************************************************
		
		session.setAttribute("OBJ_SC_BUSQ", null);
		session.setAttribute("OBJ_PARTIC_BUSQ", null);
		
		
//		Persona persona;
//		persona = sRELServiceWS.getPersona("10243093");
		
		String coddep = null;
		String codpro = null;
		String coddis = null;
		String accion = null;
		String conAmbito = "0";
		String codEstadosResponsable = null;
		Boolean conCriteriosBusqueda = false;
		Integer idNivelGobierno = 0;
		Integer idSector = 0;
		Integer idEjecutora = null;
		Integer idSistema = null;
		Integer idResponsable = null;
		//variable juank
		String codRegimen="";
		String codProfesion="";
		String correo = "";
		String fecRegistro="";
		String fecValidacion="";
		String fecRegistroFin="";
		String fecValidacionFin="";
		String fecHabilita = "";
		String fecHabilitaFin = "";		
		String procedencia = "";
		Boolean adCorreo = false; 
		Boolean adParticipante = false;
		String descripcionAmbito = "";
		ResponsableBusqueda objPrevio = null;
		// obtener valores del accion de usuario
		coddep = request.getParameter("coddep");
		codpro = request.getParameter("codpro");
		coddis = request.getParameter("coddis");
		codEstadosResponsable = request.getParameter("codEstadosResponsable");
		accion = request.getParameter("accion");
		System.out.println("accion realizada : "+accion);
		// Ver de donde procede el llamado a la página
		if (request.getParameter("procedencia") != null)
			procedencia  = request.getParameter("procedencia");
		
		// si el obj de la pagina previa es null ( no se hizo busqueda ejecutar el flujo normal)
		if ((ResponsableBusqueda)session.getAttribute("OBJ_RESP_BUSQ")== null)
			procedencia = "";
		
		if (accion!= null && accion.equals("ADICIONAR_CORREO"))
		{
			procedencia = "RESP_EDICION";
			adCorreo = true;
			accion = "BUSCAR";
		}

		if (accion!= null && accion.equals("ADICIONAR_PARTICIPANTE"))
		{
			procedencia = "RESP_EDICION";
			adParticipante = true;
			accion = "BUSCAR";
		}
		
		if (!procedencia.equals("RESP_EDICION"))
		{		
		
		/*================================
		 * llenando los combos profesiones y regimenes
		 *================================ 
		*/
		LinkedList<Profesion> profesions = capacidadesService.ObtenerProfesion();
		LinkedList<Regimen> regimens = capacidadesService.ObtenerRegimen();
		
		obj.setRegimens(regimens);
		obj.setProfesions(profesions);
		// Obtener combos 
		
		obj.setOptEstadosResponsable(capacidadesService.ObtenerEstadosResponsable());
		obj.setOptEstadosInscritos(capacidadesService.ObtenerEstadosInscritos());
		obj.setOptEstadosPlazo(capacidadesService.ObtenerEstadosPlazo());
		
		// Valores del formulario
		if (request.getParameter("codEstadosResponsable") != null)
			obj.setCodEstadosResponsable(request.getParameter("codEstadosResponsable"));
		if (request.getParameter("codEstadosPlazo") != null)
			obj.setCodEstadosPlazo(request.getParameter("codEstadosPlazo"));
		if (request.getParameter("codEstadosInscritos") != null)
			obj.setCodEstadosInscritos(request.getParameter("codEstadosInscritos"));
		
		obj.setFiltroSinEjecutora("0");
		if (request.getParameter("filtroSinEjecutora") != null)
			obj.setFiltroSinEjecutora(request.getParameter("filtroSinEjecutora"));

		//if (obj.getCodEstadosResponsable() == null)
		//	obj.setCodEstadosResponsable("REGI");
	
		if (accion != null)
			if (accion.equals("RETORNO"))
				accion = null;
		
		if (accion != null && !accion.equals(""))
		{
			if (request.getParameter("idNivelGobierno") != null)
				idNivelGobierno = Integer.parseInt(request.getParameter("idNivelGobierno").toString());

			if (request.getParameter("idSector") != null)
				idSector = Integer.parseInt(request.getParameter("idSector").toString());

			if (request.getParameter("idResponsable") != null & !request.getParameter("idResponsable").equals(""))
				idResponsable = Integer.parseInt(request.getParameter("idResponsable").toString());
			
			if (request.getParameter("codRegimen") != null && !request.getParameter("codRegimen").trim().equals(""))
				codRegimen = request.getParameter("codRegimen");
			
			if (request.getParameter("codProfesion") != null && !request.getParameter("codProfesion").trim().equals(""))
				codProfesion = request.getParameter("codProfesion");
			
			if (request.getParameter("fecRegistro") != null && !request.getParameter("fecRegistro").trim().equals(""))
				fecRegistro= request.getParameter("fecRegistro");
			
			if (request.getParameter("fecValidacion") != null && !request.getParameter("fecValidacion").trim().equals(""))
				fecValidacion= request.getParameter("fecValidacion");
			
			if (request.getParameter("fecRegistroFin") != null && !request.getParameter("fecRegistroFin").trim().equals(""))
				fecRegistroFin= request.getParameter("fecRegistroFin");
			
			if (request.getParameter("fecValidacionFin") != null && !request.getParameter("fecValidacionFin").trim().equals(""))
				fecValidacionFin= request.getParameter("fecValidacionFin");
			
			if (request.getParameter("fecHabilita") != null && !request.getParameter("fecHabilita").trim().equals(""))
				fecHabilita= request.getParameter("fecHabilita");
			
			if (request.getParameter("fecHabilitaFin") != null && !request.getParameter("fecHabilitaFin").trim().equals(""))
				fecHabilitaFin= request.getParameter("fecHabilitaFin");

			/*if (idNivelGobierno == 2)
			{	
			if (request.getParameter("idSector") != null)
			{	
				if (!(request.getParameter("idSector").equals("")))
				{	
					idSector = Integer.parseInt(request.getParameter("idSector").toString());
					if (idSector != 0)
					{
						obj.setIdSector(idSector);
						obj.setPliegos(capacidadesService.ObtenerPliegos(idSector));
					}
					}
				}
			}
			
			
			if (accion.equals("REFRESCARSEC"))
			{
				obj.setIdPliego(0);
				idPliego = null;
			}
			else if (request.getParameter("idPliego") != null & idSector != null)
			{	
				if (!(request.getParameter("idPliego").equals("")) & idSector != 0)
				{
					idPliego = Integer.parseInt(request.getParameter("idPliego").toString());
					obj.setIdPliego(idPliego);
				}
			}
			*
			*/	
			String ubigeo = "";
			if (coddep != null && !coddep.equals("0"))
				ubigeo = coddep;
			if (codpro != null && !codpro.equals("0"))
				ubigeo += codpro;
			if (coddis != null && !coddis.equals("0"))
				ubigeo += coddis;
			
			if (request.getParameter("idEjecutora") != null & idNivelGobierno != null ) //& idPliego != null
			{
				if (!(request.getParameter("idEjecutora").equals("")) ) // & idPliego != 0
				{	
					idEjecutora = Integer.parseInt(request.getParameter("idEjecutora").toString());
					obj.setIdEjecutora(idEjecutora);
					obj.setEjecutoras(capacidadesService.ObtenerEjecutorasNivelGobierno(idNivelGobierno,ubigeo,idSector));
				}
			}
			obj.setCoddep(coddep);
			
			if (coddep != null)
			{
				if (!coddep.equals("0"))
				{
					obj.setCoddep(coddep);
					obj.setProvincias(capacidadesService.ObtenerProvincias(coddep));
				}
			}
			
			if (accion.equals("REFRESCARDEP"))
			{
				obj.setCodpro("0");
				codpro = null;
				accion = "REFRESCAR";
			}

			if (codpro != null )
			{	
				obj.setCodpro(codpro);
				if (!codpro.equals("") & !(codpro .equals("0")))
				{
					obj.setDistritos(capacidadesService.ObtenerDistritos(coddep, codpro));
				}
			}
		}
		else
			obj.setAccion("REFRESCAR");
		
		obj.setIdNivelGobierno(idNivelGobierno);
		obj.setIdSector(idSector);
		
		obj.setNivelGobiernos(capacidadesService.ObtenerNivelGobiernos());
		obj.setDepartamentos(capacidadesService.ObtenerDepartamentos());
		obj.setCodRegimen(codRegimen);
		obj.setCodProfesion(codProfesion);
		
		obj.setFecRegistro(fecRegistro);
		obj.setFecValidacion(fecValidacion);
		obj.setFecHabilita(fecHabilita);

		obj.setFecRegistroFin(fecRegistroFin);
		obj.setFecValidacionFin(fecValidacionFin);
		obj.setFecHabilitaFin(fecHabilitaFin);

		Integer idAmbito = 0;
		idSistema = 0;
		
		if (idNivelGobierno == 2)
			obj.setSectores(capacidadesService.ObtenerSectors());

		obj.setSistemas(capacidadesService.ObtenerSistema());
		
		if (request.getParameter("idAmbito") != null && request.getParameter("idAmbito") != "" && request.getParameter("idAmbito") != "0")
		{
			idAmbito = Integer.parseInt(request.getParameter("idAmbito"));
			obj.setIdAmbito(idAmbito);
		}
		
		if (request.getParameter("idSistema") != null)
		{
			idSistema = Integer.parseInt(request.getParameter("idSistema"));
			obj.setIdSistema(idSistema);
		}
		if (idSistema != 0)
		{
			Iterator itr = null;
			Sistema s = null;
			itr = obj.getSistemas().iterator();
			if (itr!= null)
			{
			Integer row = 0; 
			while(itr.hasNext()){
				row += 1;
				s=(Sistema)itr.next();
				if (s.getId_sistema().intValue() == idSistema)
				{
					obj.setAmbitos(capacidadesService.ObtenerAmbito(idSistema));
					if (s.getCon_ambitos().equals("1"))
					{	// el sistema tiene más de 1 ambito
						conAmbito = "1";
					}
					else
					{	// si tiene 1 ambito siempre se selecciona a este
						idAmbito = obj.getAmbitos().getFirst().getId_ambito().intValue();
						obj.setIdAmbito(idAmbito);
					}
				}
			}
			}
		  }
		obj.setConAmbito(conAmbito);
		
		
		// set valores de los controles
		
		if (accion!= null)
		{	
			String nombres = (String) request.getParameter("nombres");
			if (nombres != null)
				obj.setNombres(nombres.toUpperCase().trim());
			String apellidosPaterno = (String) request.getParameter("apellidosPaterno");
			if (apellidosPaterno != null)
			obj.setApellidos_paterno(apellidosPaterno.toUpperCase().trim());
			String apellidosMaterno = (String) request.getParameter("apellidosMaterno");
			if (apellidosMaterno != null)
				obj.setApellidos_materno(apellidosMaterno.toUpperCase().trim());
			String dni = (String) request.getParameter("dni");
			if (dni!= null)
				obj.setDni(dni.trim());
			if (coddep != null)
				obj.setCoddep(coddep);
			if (codpro != null)
				obj.setCodpro(codpro);
			if (coddis != null)
				obj.setCoddis(coddis);
			if(request.getParameter("correo") != null)
				correo = (String)request.getParameter("correo");
			obj.setCorreo(correo.toUpperCase());
		}
		obj.setMensaje("");
		// Ejecutar la busqueda
		if (accion != null)
			if (accion.equals("DEL"))
			{
				JspResponsableEdicion jspResponsableEdicion  = new JspResponsableEdicion();
				Responsable responsable = new Responsable();
				responsable.setId_responsable(idResponsable);
				jspResponsableEdicion.setResponsable(responsable);
				jspResponsableEdicion.setId_ambito(idAmbito);
				capacidadesService.EliminarParticipante(jspResponsableEdicion);
				accion = "BUSCAR";
			}	
		
		
		codEstadosResponsable = (String) request.getParameter("codEstadosResponsable"); 
		
		if (codEstadosResponsable != null)
			obj.setEstadoRegistro(codEstadosResponsable);

		obj.setAccion(accion);
		
			if (accion != null)
			{	
				if (!accion.equals("BUSCAR"))
					objPrevio = (ResponsableBusqueda)session.getAttribute("OBJ_RESP_BUSQ");
				if (accion.equals("BUSCAR"))
					session.setAttribute("OBJ_RESP_BUSQ", obj);
			}
		}
		else
		{
			obj = (ResponsableBusqueda)session.getAttribute("OBJ_RESP_BUSQ");
			if (obj != null)
				codEstadosResponsable = obj.getEstadoRegistro();
		}
		
		// Cargar resultados de busquedas
		accion = obj.getAccion();
		List RptResponsables = null;
		String vSql = "";
		if (accion != null)
		if (accion.equals("BUSCAR"))
		{
			vSql = censoService.obtenerRptQueryResponsables(obj);
			RptResponsables = censoService.obtenerResponsableBusqueda(vSql);
			session.setAttribute("QUERY", vSql);
		}
		else
		{
			if (objPrevio != null)
			{
				vSql = censoService.obtenerRptQueryResponsables(objPrevio);
				RptResponsables = censoService.obtenerResponsableBusqueda(vSql);
			}
		}	
		
		if  (RptResponsables == null && accion == null)
		{	
			// El usuario no dese que la grilla se cargue con datos por defecto
			/*
			ResponsableBusqueda vobj = new ResponsableBusqueda(); 
			RptResponsables = capacidadesService.ObtenerResponsableBusqueda(vobj,codEstadosResponsable);
			vSql = capacidadesService.ObtenerRptQueryResponsables(obj, codEstadosResponsable);
			session.setAttribute("OBJ_RESP_BUSQ", obj);
			session.setAttribute("QUERY", vSql);
			if(obj.getMensaje().equals("")){
				if(accion == null)
					obj.setMensaje("Seleccione criterios de busqueda");
				if(RptResponsables == null)
					obj.setMensaje("Sin resultados para mostrar.");
				if(RptResponsables != null && RptResponsables.size() == 0)
					obj.setMensaje("Ninguna coincidencia para los filtros seleccionados.");
				if(RptResponsables != null && RptResponsables.size() > 0)
					obj.setMensaje("Total: "+ RptResponsables.size()+ " coincidencia para los filtros seleccionados.");
			}
			obj.setEstadoRegistro("REGI");
			*/
		}
		
		if(obj.getMensaje().equals("")){
			if(RptResponsables == null)
				obj.setMensaje("Sin resultados para mostrar.");
			if(RptResponsables != null && RptResponsables.size() == 0)
				obj.setMensaje("Ninguna coincidencia para los filtros seleccionados.");
			if(RptResponsables != null && RptResponsables.size() > 0)
				obj.setMensaje("Total "+RptResponsables.size()+ " coincidencia para los filtros seleccionados.");
		}
		
		request.setAttribute("DATALIST", RptResponsables);	
		obj.setAccion("BUSCAR");
		String verNoHablitados = "";
		
		if (RptResponsables != null)
		{
			if (RptResponsables.size() > 0)
				obj.setConResultado("1");
			else
				obj.setConResultado("0");
		}
		else
		{
			obj.setConResultado("0");
		}

		if (adCorreo)
		{
			capacidadesService.cargarResultadosBusqueda(vSql, dniUsuario, 1);
			obj.setMensaje("Total "+RptResponsables.size()+ " responsables cargados como destinarios de correo masivo.");
		}
		
		if (adParticipante)
		{
			capacidadesService.cargarResultadosBusqueda(vSql, dniUsuario, 2);
			obj.setMensaje("Total "+RptResponsables.size()+ " responsables cargados para participantes de pruebas de diagnóstico.");
		}

		Integer idPerfil = 2;
		if (session.getAttribute("perfil") !=  null)
			idPerfil = (Integer) session.getAttribute("perfil");
		obj.setIdPerfil(idPerfil);
		
		return obj;
	}
	
}
